package com.javawork.juc.two;

/**
 * 效果和上面synchronized修饰静态方法是一样的，synchronized作用于一个类T时，是给这个类T加锁，T的所有对象用的是同一把锁。
 *
 * 总结：
 * 1、 无论synchronized关键字加在方法上还是对象上，如果它作用的对象是非静态的，则它取得的锁是对象；如果synchronized作用的对象是一个静态方法或一个类，则它取得的锁是对类，该类所有的对象同一把锁。
 * 2、每个对象只有一个锁（lock）与之相关联，谁拿到这个锁谁就可以运行它所控制的那段代码。
 * 3、实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制
 *
 * @author zhangxiaolu
 * @date 2023-02-06 23:30
 */
public class SynchronizedTestDemo4 {
    public static void main(String[] args) {
        System.out.println("使用ClassName");
        SyncThread4 syncThread = new SyncThread4();
        Thread thread1 = new Thread(syncThread, "SyncThread1");
        Thread thread2 = new Thread(syncThread, "SyncThread2");
        thread1.start();
        thread2.start();
    }
}

class ClassName {
    public void method() {
        synchronized (ClassName.class) {

        }
    }
}

class SyncThread4 implements Runnable {
    private static int count;

    public SyncThread4() {
        count = 0;
    }

    public static void method() {
        synchronized (SyncThread4.class) {
            for (int i = 0; i < 5; i++) {
                try {
                    System.out.println(Thread.currentThread().getName() + ":" + (count++));
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public synchronized void run() {
        method();
    }
}